package ar.edu.utn.frba.disenio;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.joda.time.DateTime;

import ar.edu.utn.frba.disenio.aerolineas.Aerolineas;
import ar.edu.utn.frba.disenio.filtros.Filtro;
import ar.edu.utn.frba.disenio.filtros.FiltroPorUsuario;

public class Busqueda {
	
	private String origen;
	private String destino;
	private DateTime fecha;
	private boolean conEscalas;
	private Set<Filtro> filtros = new HashSet<Filtro>();
	private Comparator<Vuelo> criterioOrden;

	public Busqueda(String origen, String destino, DateTime fecha, Usuario usuario,
			boolean conEscalas, Comparator<Vuelo> criterioOrden) {
		this.origen = origen;
		this.destino = destino;
		this.conEscalas = conEscalas;
		this.setFecha(fecha);
		this.filtros.add(new FiltroPorUsuario(usuario));
		this.criterioOrden = criterioOrden;
	}


	public List<Vuelo> buscarVuelos(Aerolineas aerolineas,Usuario usuario)
	{		
		List<Vuelo> vuelos = aerolineas.buscarVuelos(usuario, this);
		
		for(Filtro filtro : getFiltros())
		{
			filtro.filtrarVuelos(vuelos);
		}
		
		if(this.criterioOrden != null)
			Collections.sort(vuelos, this.criterioOrden);
		
		return vuelos;
	}
	
	public void agregarFiltro(Filtro filtro)
	{
		if(!filtro.isObligatorio())
			this.getFiltros().add(filtro);
	}
	
	public void removerFiltro(Filtro filtro)
	{
		if(!filtro.isObligatorio())
			this.getFiltros().remove(filtro);
	}
	
	public String getOrigen() {
		return origen;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getDestino() {
		return destino;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public Comparator<Vuelo> getCriterioOrden() {
		return criterioOrden;
	}

	public void setCriterioOrden(Comparator<Vuelo> criterioOrden) {
		this.criterioOrden = criterioOrden;
	}

	public boolean isConEscalas() {
		return conEscalas;
	}

	public void setConEscalas(boolean conEscalas) {
		this.conEscalas = conEscalas;
	}
	
	public DateTime getFecha() {
		return fecha;
	}


	public void setFecha(DateTime fecha) {
		this.fecha = fecha;
	}


	public Set<Filtro> getFiltros() {
		return filtros;
	}


	public void setFiltros(Set<Filtro> filtros) {
		this.filtros = filtros;
	}
}
